#!/user/bin/env python3
# -*- coding: utf-8 -*-
#-------------------------------------------------------------------------------
import cx_Oracle,pymysql
from common.read_yaml import ReadYaml
import json
from datetime import datetime
from typing import Union
import os
os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.UTF8'          #设置解码格式，使查询结果可显示中文
class DataBase_db:
    data_db = ReadYaml("config01.yaml").get_yaml_data()  # 读取数据



    def __init__(self):
        """
        # 初始化数据库连接，并指定查询的结果集以字典形式返回
        #
        # """

        if self.data_db.get('database').get('database_type').lower() == 'oracle':
            self.connection = cx_Oracle.connect(
                self.data_db.get('database').get("user"),
                self.data_db.get('database').get("pwd"),
                "%s:%s/%s" % (self.data_db.get('database').get("host"), self.data_db.get('database').get("port"),
                              self.data_db.get('database').get("db_name")),  # 192.168.1.2:1521/helowin
                encoding=self.data_db.get('database').get("encoding",'UTF-8'),
            )
        if self.data_db.get('database').get('database_type').lower() == 'mysql':
            self.connection = pymysql.connect(
                host=self.data_db.get('database').get("host"),
                port=self.data_db.get('database').get("port"),
                user=self.data_db.get('database').get("user"),
                password=self.data_db.get('database').get("pwd"),
                db=self.data_db.get('database').get("db_name"),
                charset=self.data_db.get('database').get('charset', 'utf8mb4'),
                cursorclass=pymysql.cursors.DictCursor
            )

    def execute_sql(self, sql: str) -> Union[dict, None]:
        """
        执行sql语句方法，查询所有结果的sql只会返回一条结果（
        比如说： 使用select * from cases , 结果将只会返回第一条数据    {'id': 1, 'name': 'updatehahaha', 'path': None, 'body': None, 'expected': '{"msg": "你好"}', 'api_id': 1, 'create_at': '2021-05-17 17:23:54', 'update_at': '2021-05-17 17:23:54'}

        ），支持select， delete， insert， update
        :param sql: sql语句
        :return: select 语句 如果有结果则会返回 对应结果字典，delete，insert，update 将返回None
        """
        with self.connection.cursor() as cursor:
            cursor.execute(sql)
            result = cursor.fetchone()
            # 使用commit解决查询数据出现概率查错问题
            self.connection.commit()
            return self.verify(result)

    def verify(self, result: dict) -> Union[dict, None]:
        """验证结果能否被json.dumps序列化"""
        # 尝试变成字符串，解决datetime 无法被json 序列化问题
        try:
            json.dumps(result)
        except TypeError:   # TypeError: Object of type datetime is not JSON serializable
            for k, v in result.items():
                if isinstance(v, datetime):
                    result[k] = str(v)
        return result

    def close(self):
        """关闭数据库连接"""
        self.connection.close()



# sql='''SELECT * FROM dolp_users WHERE id=1'''
# data_test=DataBase_db().execute_sql(sql)
# print(data_test)
# DataBase_db().close()